package com.learning.servlet2x.config;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

/**
 * ClassName: ResourceServlet
 * Description: 使用 ServletContext 和 类加载器 加载资源数据
 * Date: 2018/6/24 7:56 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class ResourceServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();

        // 默认从 Web 应用根目录下取资源，Tomcat下 path 是否以 '/' 开头无所谓, 建议加上'/', 和具体的容器有关

        // 直接获取流对象
        InputStream resourceAsStream = servletContext.getResourceAsStream("/downLoad/file.properties");
        getProperties(resourceAsStream);

        // 获取绝对路径
        String realPath = servletContext.getRealPath("downLoad/file.properties");
        System.out.println(realPath);
        InputStream stream = new FileInputStream(realPath);
        getProperties(stream);

        // 获取URL对象，然后再次获取path与数据流
        URL resource = servletContext.getResource("downLoad/file.properties");
        String path = resource.getPath();
        System.out.println(path);
        InputStream inputStream = resource.openStream();
        getProperties(inputStream);


    }

    /**
     * Learning-Servlet/servlet-2x/src/main/resources/file.properties # resources 下的资源编译的时候放入 /WEB-INF/classes 目录
     * Learning-Servlet/servlet-2x/src/main/webapp/downLoad/file2.properties # webapp 下的资源编译的时候会直接放入根目录
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();

        // 这种情况Spring 是可以很好处理的, 见博客文章 Spring 分类
        // 使用 ServletContext 不怎么好处理（毕竟 classes 是编译以后生成的），可以使用类加载器（ClassLoad）处理
        String realPath2 = servletContext.getRealPath("/WEB-INF/classes/file2.properties");
        System.out.println(realPath2);
        InputStream stream2 = new FileInputStream(realPath2);
        getProperties(stream2);

        // 默认则是从 ClassPath 根下获取，path不能以'/'开头，最终是由 ClassLoader 获取资源。
        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("file2.properties");
        getProperties(resourceAsStream);
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 默认则是从 ClassPath 根下获取，path不能以'/'开头，最终是由 ClassLoader 获取资源。
        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("file2.properties");
        getProperties(resourceAsStream);


        // path 不以'/'开头时默认是从此类所在的包下取资源，以'/'开头则是从ClassPath(Src根目录)根下获取。
        // 其只是通过path构造一个绝对路径，最终还是由ClassLoader获取资源。
        resourceAsStream = getClass().getResourceAsStream("/file2.properties");
        getProperties(resourceAsStream);
    }

    /**
     * 打印
     *
     * @param in
     * @throws IOException
     */
    private void getProperties(InputStream in) throws IOException {
        Properties props = new Properties();
        props.load(in);
        props.list(System.out);
    }
}
